package com.itheima.controller;

import com.alibaba.dubbo.config.annotation.Reference;
import com.itheima.POJO.OrderSetting;
import com.itheima.constant.MessageConstant;
import com.itheima.entity.Result;
import com.itheima.service.ordersettingService;
import com.itheima.utils.POIUtils;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;

@RestController
@RequestMapping("/ordersetting")
public class OrderSettingController {

    @Reference
    private ordersettingService ordersettingService;

    /**
     * 文件上传,并且把文件进行解析放到数据库中
     * 问:  为什么只要放可预约时间和可预约人数进数据库,而已预约人数不放
     * 答:  后台管理系统,只需将时间可预约人数进行设置,
     * 而已预约人数 是通过用户预约产生的而进行改变的,
     * 就像医生,只需要设置时间和可预约人数,而已预约人数是患者预约后产生的  不是医生设置的
     * 或者说,就算是医生设置的,也需要患者预约人数的这个信息,
     * 而且我们这个文件上传只是为了设置,预约时间和可预约人数,已预约人数后面设置
     * <p>
     * 问:后台管理系统,需要展示 可预约时间,可预约人数,已预约人数,为什么我这里只把前两个放进了数据库,而已预约人数数据库中没有,
     * 该如何展示?
     *
     * @param excelFile
     * @return
     */
    //  "/ordersetting/upload.do"
    @PreAuthorize("hasAuthority('ORDERSETTING')")
    @RequestMapping("/upload")
    public Result upload(@RequestParam("excelFile") MultipartFile excelFile) {
        // 该方法 读取文件,将文件中的预约时间 和 可预约人数 设置到数据库中
        //通过文件 设置 可预约时间 和 可预约人数
        /*
        文件上传的方法,excelFile保存的是Excel文件对象
        用POI的工具类 读取这个文件 得到该文件上的每一行 单元格的字符数组
        List<String [] >
        String [] 里面保存的是每一行的所有单元格的数据
        很多这样的字符数组 就放到了 list集合中
         遍历这个 list集合 拿到每一行
         将每一行的的第一个单元格的数据,和每一行的第二个单元格的数据 作为参数创建 ordersetting对象
         将这一个个创建好的 ordersetting对象放到list集合中

         将这个 保存了很多歌ordersetting 的集合 放到service层进行遍历,把每一个对象里面的 预约时间 和 可预约人数 保存到数据库
         */
        try {
            //读取这个文件,得到 每一行单元格的数组 集合
            List<String[]> cellsList = POIUtils.readExcel(excelFile);
            if (cellsList != null && cellsList.size() > 0) {
                //该文件中 有行对应的单元格数据
                ArrayList<OrderSetting> orderSettingArrayList = new ArrayList<>();
                for (String[] cells : cellsList) {
                    //根据查看文件可知,cells[0] 为时间   cells[1]为可预约人数
                    OrderSetting orderSetting = new OrderSetting(new Date(cells[0]), Integer.parseInt(cells[1]));
                    //将设置好可预约时间 和 可预约人数的 OrderSetting对象放入得到 集合中
                    orderSettingArrayList.add(orderSetting);
                }
                //将保存了 orderSetting的信息通过service层放到数据库
                //这里只放了  可预约时间和可预约人数
                ordersettingService.addOrdersetting3orderDateAndnumber(orderSettingArrayList);
            } else {
                return new Result(false, "预约设置数据为空,无需导入");
            }
        } catch (RuntimeException e) {
            return new Result(false, e.getMessage());
        } catch (IOException e) {
            e.printStackTrace();
            return new Result(false, MessageConstant.IMPORT_ORDERSETTING_FAIL);//批量导入预约设置数据失败
        }
        return new Result(true, MessageConstant.IMPORT_ORDERSETTING_SUCCESS);//批量导入预约设置数据成功
    }
    @PreAuthorize("hasAuthority('ORDERSETTING')")
    @RequestMapping("/getOrderSettingByMouth")
    public Result getOrderSettingByMouth(String date) {

        /*this.leftobj = [
                        { date: 1, number: 120, reservations: 1 },
                        { date: 3, number: 120, reservations: 1 },
                        { date: 4, number: 120, reservations: 120 },
                        { date: 6, number: 120, reservations: 1 },
                        { date: 8, number: 120, reservations: 1 }
                    ];*/

        try {
            List<Map> orderSettingMap= ordersettingService.findOrdersettingBydate(date);
            return new Result(true,MessageConstant.GET_ORDERSETTING_SUCCESS,orderSettingMap);

        } catch (Exception e) {
            e.printStackTrace();
        }
        return new Result(false,MessageConstant.GET_ORDERSETTING_FAIL);
    }

    @PreAuthorize("hasAuthority('ORDERSETTING')")
    @RequestMapping("/editNumberByDate")
    public Result editNumberByDate(@RequestBody OrderSetting orderSetting){
        System.out.println(orderSetting);
        return null;
       /* //System.out.println(orderSetting);
        try {
            ordersettingService.setOrdersetting(orderSetting);
            return new Result(true,"设置成功");
        } catch (RuntimeException e) {
            e.printStackTrace();
            return new Result(false,e.getMessage());
        }*/
    }
}
